X-Git-Url: https://git.r.bdr.sh/rbdr/super-polarity/blobdiff_plain/8534e46e400268c5ceffb3b14f02cef39eedae8f..3de51c6f55d304f038df1b77c8ab346e2a187fe1:/Super%20Polarity/Actors/Ship.cs diff --git a/Super Polarity/Actors/Ship.cs b/Super Polarity/Actors/Ship.cs new file mode 100644 index 0000000..229f639 --- /dev/null +++ b/Super Polarity/Actors/Ship.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace SuperPolarity +{ + class Ship : Actor + { + public enum Polarity : byte { Negative, Positive, Neutral }; + + public Polarity CurrentPolarity; + public uint MagneticRadius; + + public float FleeVelocity; + public float ActVelocity; + public float ChargeVelocity; + public int RepelRadius; + + protected bool Magnetizing; + + public Ship(SuperPolarity newGame) : base(newGame) { + MagneticRadius = 250; + RepelRadius = 100; + + HP = 2; + + FleeVelocity = 5; + ActVelocity = 1; + ChargeVelocity = 2.5f; + CurrentPolarity = Polarity.Neutral; + Magnetizing = false; + } + + public virtual void SwitchPolarity() + { + if (CurrentPolarity == Polarity.Positive) + { + CurrentPolarity = Polarity.Negative; + } + else + { + CurrentPolarity = Polarity.Positive; + } + } + + public virtual void SetPolarity(Polarity newPolarity) + { + CurrentPolarity = newPolarity; + } + + public virtual void Shoot() + { + } + + public override void Update(GameTime gameTime) + { + base.Update(gameTime); + Magnetizing = false; + } + + public virtual void Magnetize(Ship ship, float distance, float angle) + { + Magnetizing = true; + Polarity polarity = ship.CurrentPolarity; + + if (polarity != CurrentPolarity) + { + Attract(angle); + } + else + { + Repel(distance, angle); + } + } + + protected void Attract(float angle) + { + Velocity.X = (float) (ChargeVelocity * Math.Cos(angle)); + Velocity.Y = (float) (ChargeVelocity * Math.Sin(angle)); + } + + protected void Repel(float distance, float angle) + { + if (distance > RepelRadius) { Magnetizing = false; return; } + Velocity.X = -(float)(FleeVelocity * Math.Cos(angle)); + Velocity.Y = -(float)(FleeVelocity * Math.Sin(angle)); + } + } +}